package quick.start.producer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import constant.Constants;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created with IntelliJ IDEA.
 * Description：实现 RabbitMQ 的客户端 -- 生产者
 *
 * @author: zxj
 * @date: 2024-09-18
 * @time: 14:25:51
 */
public class RabbitMQProducer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置参数
        factory.setHost(Constants.HOST);
        factory.setPort(Constants.PORT);
        factory.setVirtualHost(Constants.VIRTUAL_HOST);
        factory.setUsername(Constants.USERNAME);
        factory.setPassword(Constants.PASSWORD);
        // 3. 创建连接Connection
        Connection connection = factory.newConnection();
        // 4. 创建 channel
        Channel channel = connection.createChannel();

        // 5. 声明一个队列
        /*
         * public AMQP.Queue.DeclareOk queueDeclare(
         * String queue, 队列名字
         * boolean durable, 是否持久化, true 设置队列为持久化, 持久化的队列会存盘, 服务器重启之后, 消息不会丢失
         * boolean exclusive, 是否独立, 只能有一个消费者监听队列; 当 Connection 关闭时, 是否删除队列
         * boolean autoDelete, 是否自动删除, 当没有 Consumer 时, 自动删除
         * Map<String, Object> arguments) 一些参数
         *
         * 该函数的功能是声明一个队列, 当队列不存在的时候, 就创建队列, 存在的时候不创建.
         * 1. 避免了多次创建同一个队列
         * 2. 防止了队列不存在时候报错
         */
        channel.queueDeclare(Constants.SIMPLE_QUEUE_NAME, true, false, false, null);

        // 6. 通过 channel 发送消息到指定队列中
        /*
         * void basicPublish(
         * String exchange,  交换机名称, 简单模式下, 交换机会使⽤默认的""
         * String routingKey,  路由名称, routingKey = 队列名称, 会依据不同模式而匹配不同的队列, 这里的 routingKey 简单模式的, 直接填想要发送的队列的名字
         * BasicProperties props, 配置信息
         * byte[] body 发送的数据内容
         * ) throws IOException;
         *
         **/
        String msg = "hello rabbitmq";
        channel.basicPublish("", Constants.SIMPLE_QUEUE_NAME, null, msg.getBytes());
        System.out.println(msg + ": 消息发送成功");

        // 7. 释放资源
        channel.close();
        connection.close();
    }
}
